#pragma once
#include <vector>
#include <string>
#include <map>
#include "Worker.h"

// 任务类型 子类型我没用处 但是为了加速循环对比 直接拿空间换时间去了
enum TaskType{
    TaskTypeMax = 50
};
// 包含技战任务
enum TaskCate
{
    TaskCate_None,
    TaskCate_RealTask, // 实时任务
    TaskCate_Skill,    // 技战任务
};

enum TaskParam
{
    TaskParam_Skill_Enable_Time = 0,
    TaskParam_Skill_Sustain_Minute = 1,
    TaskParam_Skill_Handle_Minute = 2,
};

// 单 任务信息 好像没啥卵用
class Task
{
public:
    TaskCate cate;      // 种类
    int id;             // 唯一编号
    std::string name;   // 任务名称
	int type;		    // 任务类型
    std::vector<std::string> extras; // 额外参数
};

enum RoiType{
    RoiType_None = 0,
    RoiType_Box = 1,
};

class RoiPoint{
public:
	float x;
	float y;
    RoiPoint(float x, float y){this->x = x; this->y = y;}
};

class Roi{
public:
    std::vector<RoiPoint> points;
};


// 摄像机信息 仅仅需要的(TODO暂时当作没有删除)
class CameraInfo{
public:
	int id;			                            // 摄像机Id
    std::string location;                       // 摄像机位置
	int type;		                            // 摄像机类型(不知道有啥用处 再说了)
	int enable;		                            // 是否启用
    std::string srois;                          // 字符串Roi列表 比对用
	std::map<int, std::vector<Roi>> rois;       // Roi列表 算法 -- ROI区域列表
    std::string url;                            // 地址

    bool dirty_sync = false;                     // 是否脏 同步算法服
    bool dirty_worker = false;                   // 是否脏 重新启动worker
    bool dirty_remove = false;                  // 是否脏 删除


    std::vector<Task> tasks;                    // 任务列表
    std::shared_ptr<Worker> worker = nullptr;   // 任务
};


class TaskInfo
{
public:
    int id;
    TaskCate cate;
    std::string name;                       
    std::string stypes;
    std::vector<int> types;
    std::string scams;
    std::vector<int> cams;                      // 相机列表
    std::vector<int> cams_remove;               // 移除的相机列表
    bool dirty_cams = false;                    // 相机/类型是否有更改
    bool dirty_remove = false;                  // 是否脏 删除
    std::vector<std::string> extras;             // 额外参数 
};